/*
Copyright (C) 2008 raohmaru <http://www.raohmaru.com>

This file is part of Raohmaru AS3 Framework.

Raohmaru AS3 Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Raohmaru AS3 Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Raohmaru AS3 Framework.  If not, see <http://www.gnu.org/licenses/>.
*/

package jp.raohmaru.controls 
{
import flash.events.Event;
import flash.events.EventDispatcher;

/**
 * La clase RadioButtonGroup define un grupo de controles RadioButton para que actúen como un solo control. Sólo se puede seleccionar un botón de
 * opción del mismo grupo.<br>
 * Cuando un control RadioButton es seleccionado por el usuario, dispara un evento <code>Event.CHANGE</code>.
 * @example
<listing version="3.0">
import jp.raohmaru.controls.RadioButton;
import jp.raohmaru.controls.RadioButtonGroup;

var rbg : RadioButtonGroup = new RadioButtonGroup("condimento");
	rbg.addEventListener(Event.CHANGE, groupHandler);

var rb1 : RadioButton = new RadioButton(test1_rb, "Con sal", 1, rbg);
	rb1.addEventListener(Event.SELECT, rbHandler);

var rb2 : RadioButton = new RadioButton(test2_rb, "Con azúcar", 2, rbg);
	rb2.addEventListener(Event.SELECT, rbHandler);

function groupHandler(e : Event) : void
{
	trace(e.target.name, e.target.selectedData);
}

function rbHandler(e : Event) : void
{
	trace(e.target.name, e.target.label, e.target.value);
}
</listing> 
 * @author raohmaru
 * @version 1.0.1
 */
public class RadioButtonGroup extends EventDispatcher 
{
	private var _name : String,
				_selection : RadioButton,
				_list : Array;

	/**
	 * Obtiene o define el nombre del objeto RadioButtonGroup. 
	 */
	public function get name() : String
	{
		return _name;
	}
	public function set name(value : String) : void
	{
		_name = value;
	}
	
	/**
	 * Obtiene o define una referencia al control seleccionado en el grupo de RadioButton. La propiedad <code>selected</code> del control seleccionado pasa a ser
	 * <code>true</code>, y <code>false</code> la del resto de controles del grupo. Es recomendable usar este atributo para seleccionar un RadioButton en lugar
	 * de RadioButton.selected.
	 * @example
	<listing version="3.0">
	import jp.raohmaru.controls.RadioButton;
	import jp.raohmaru.controls.RadioButtonGroup;
	
	var rbg : RadioButtonGroup = new RadioButtonGroup("noticias");
	
	var rb1 : RadioButton = new RadioButton(si_rb, "Sí", true, rbg);	
	var rb2 : RadioButton = new RadioButton(no_rb, "No", false, rbg);
	
	rbg.selection = rb1;
	</listing> 
	 */
	public function get selection() : RadioButton
	{
		return _selection;
	}
	public function set selection(value : RadioButton) : void
	{
		_selection = value;
		dispatchEvent(new Event(Event.CHANGE));
	}	
	
	/**
	 * Obtiene la propiedad <code>value</code> del RadioButton seleccionado. Si no hay seleccionado ningún control, esta propiedad será null. 
	 */
	public function get selectedData() : Object
	{
		return (_selection ? _selection.value : null);
	}
	
	/**
	 * Define la propiedad <code>value</code> y selecciona el RadioButton correspondiente. 
	 */
	public function set selectedData(value :Object) : void
	{
		var founded :RadioButton;
				
		for(var i:int=0; i<_list.length; i++) 
		{
			if(RadioButton(_list[i]).value == value)
			{
				founded = _list[i];
				break;
			}
		}
		
		if(founded)	selection = founded;
	}
	
	/**
	 * Obtiene el número de controles de este grupo. 
	 */
	public function get numRadioButtons() : int
	{
		return _list.length;
	}			
	
	
	
	/**
	 * Crea una nueva instancia de RadioButtonGroup. Esta acción se suele realizar automáticamente al crear una instancia de RadioButton.
	 * @param name El nombre del grupo
	 */
	public function RadioButtonGroup(name : String)
	{
		_name = name;
		_list = new Array();
	}
	
	/**
	 * Añade un botón de opción a la matriz interna de botones de opción. Este método se invoca automáticamente al crear un control RadioButton.
	 * @param radioButton Instancia RadioButton que se añade al grupo
	 */
	public function addRadioButton(radioButton : RadioButton) : void
	{
		_list.push(radioButton);
	}
	
	/**
	 * Recupera el componente RadioButton en la ubicación de índice especificada.
	 * @param index Índice del componente RadioButton
	 */
	public function getRadioButtonAt(index : int) : RadioButton
	{
		return (_list[index]) ? _list[index] : null;
	}
}
}